/**********
This library is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 2.1 of the License, or (at your
option) any later version. (See <http://www.gnu.org/copyleft/lesser.html>.)

This library is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
more details.

You should have received a copy of the GNU Lesser General Public License
along with this library; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
**********/
// "liveMedia"
// Copyright (c) 1996-2010 Live Networks, Inc.  All rights reserved.
// Any source that feeds into a "H264VideoRTPSink" must be of this class.
// This is a virtual base class; subclasses must implement the
// "currentNALUnitEndsAccessUnit()" virtual function.
// C++ header

#ifndef _FRAMED_FILTER_HH
#include "FramedFilter.hh"
#endif
#include "UserType.h"

class IPCameraH264VideoStreamFramer: public FramedFilter {
public:
	virtual Boolean currentNALUnitEndsAccessUnit();
	// subclasses must define this function.  It returns True iff the
	// most recently received NAL unit ends a video 'access unit' (i.e., 'frame')
	static IPCameraH264VideoStreamFramer*
		createNew(UsageEnvironment& env, FramedSource* inputSource);

protected:
	IPCameraH264VideoStreamFramer(UsageEnvironment& env, FramedSource* inputSource);
	virtual ~IPCameraH264VideoStreamFramer();

private:
	// redefined virtual functions:
	virtual Boolean isH264VideoStreamFramer() const;
	virtual void doGetNextFrame();

private:
	void getAndDeliverData(); // used to implement "doGetNextFrame()"
	static void afterGettingFrame(void* clientData, unsigned frameSize,
		unsigned numTruncatedBytes,
	struct timeval presentationTime,
		unsigned durationInMicroseconds);
	void afterGettingFrame1(unsigned frameSize, unsigned numTruncatedBytes);
	void getProfile();

private:
	void const* fOurProfile;
	struct timeval fNextFramePresentationTime;
	unsigned char fSavedInitialBlocks[100];
	char fInitialBlocksPresent;
	Boolean fSourceIsSeekable;

public:
	int		prevImageLength;
	int		int_stream_id;
	void*	ptr_frame_buffer;
};

